import Post from '../model/Post'
import Links from '../model/Links'
import UserCollect from '../model/UserCollect'
import { v4 as uuidv4 } from 'uuid'
import fs from 'fs'
import { getJWTPayload, cheackCode, rename } from '../common/utils'
import User from '../model/User'
import moment from 'dayjs'
import config from '../config/index'
// import { dirExists } from '../common/utils'
import makedir from 'make-dir'
class ContentController {
  // 获取文章接口
  async getPostList (ctx) {
    const params = ctx.query
    // 测试数据
    // const post = new Post({
    //   title: '这是测试数据',
    //   content: 'test content',
    //   // 提问
    //   catalog: 'ask',
    //   fav: 39,
    //   // 是否结帖0=》未结，否则已结
    //   isEnd: '0',
    //   created: '2021-02-22 19:59:20',
    //   reads: '0',
    //   // 评论
    //   answer: 9,
    //   status: '0',
    //   // 1=>指定
    //   isTop: '1',
    //   sort: '0',
    //   tags: [{
    //     name: '大前端',
    //     class: ''
    //   }]
    // })
    // const tmp = await post.save()
    // console.log('getPostList ~ tmp', tmp)
    const sort = params.sort ? params.sort : 'created'
    const page = params.page ? parseInt(params.page) : 0
    const limit = params.limit ? parseInt(params.limit) : 20
    const options = {}
    // 查 catlog
    if (typeof params.catalog !== 'undefined' && params.catalog !== '') {
      options.catalog = params.catalog
    }
    // 查 置顶
    if (typeof params.isTop !== 'undefined' && params.isTop !== '') {
      options.isTop = params.isTop
    }
    // 查 是否结帖，前端status表isend
    if (typeof params.status !== 'undefined' && params.status !== '') {
      options.isEnd = params.status
    }
    // 查 tag
    if (typeof params.tag !== 'undefined' && params.tag !== '') {
      options.tags = { $elemMatch: { name: params.tag } }
    }
    const result = await Post.getList(options, sort, page, limit)
    const total = await Post.countList(options)
    ctx.body = {
      code: 200,
      data: result,
      msg: '获取文章列表成功!',
      total: total
    }
  }

  // 获取友情链接
  async getLinks (ctx) {
    const result = await Links.find({ type: 'link' })
    // 测试数据
    // const links = new Links({
    //   title: 'react',
    //   type: 'link',
    //   link: 'https://reactjs.org/',
    //   isTop: '0',
    //   sort: '0'
    // })
    // const tmp = await links.save()
    // console.log('getPostList ~ tmp', tmp)
    ctx.body = {
      code: 200,
      data: result
    }
  }

  // 获取温馨通道
  async getTips (ctx) {
    // 测试数据
    // const links = new Links({
    //   title: '我的gitee',
    //   type: 'tips',
    //   link: 'https://gitee.com/lsfcxz',
    //   isTop: '0',
    //   sort: '0'
    // })
    // const tmp = await links.save()
    // console.log('getPostList ~ tmp', tmp)
    const result = await Links.find({ type: 'tips' })
    ctx.body = {
      code: 200,
      data: result
    }
  }

  // 本周热议
  async getTopWeek (ctx) {
    const result = await Post.getTopWeek()
    ctx.body = {
      code: 200,
      data: result
    }
  }

  // 上传图片
  async uploadImg (ctx) {
    const file = ctx.request.files.file
    // console.log(file)
    // 取图片信息，返回前台可以读取的数据
    const ext = file.name.split('.').pop()
    console.log(ext)
    const dir = `${config.uploadPath}/${moment().format('YYYYMMDD')}`
    // 判断路径是否存在，否则创建
    console.log(dir)
    // await dirExists(dir)//自定义的dirExists
    await makedir(dir)
    // 存放文件，文件名唯一
    const picname = uuidv4()// 文件名
    const destPath = `${dir}/${picname}.${ext}`// 路径+名称+后缀
    const reader = fs.createReadStream(file.path)// 读
    const upStream = fs.createWriteStream(destPath)// 写入
    const filePath = `/${moment().format('YYYYMMDD')}/${picname}.${ext}`
    // method 1 写入文件
    reader.pipe(upStream)
    // let totalLength = 0
    // // 开始读取
    // reader.on('data', (chunk) => {
    //   totalLength += chunk.length
    //   console.log(totalLength)// 读取的 进度
    //   if (upStream.write(chunk) === false) {
    //     reader.pause()
    //   }
    // })
    // reader.on('drain', () => {
    //   upStream.resume()
    // })
    // // 关闭流
    // reader.on('end', () => {
    //   upStream.end()
    // })

    ctx.body = {
      code: 200,
      msg: '图片上传成功',
      data: filePath
    }
  }

  // 添加新贴
  async addPost (ctx) {
    const { body } = ctx.request
    const sid = body.sid
    const code = body.code
    // 验证图片验证码的时效性、正确性
    const result = await cheackCode(sid, code)
    if (result) {
      const obj = await getJWTPayload(ctx.header.authorization)
      // 判断用户的积分数是否 > fav，否则，提示用户积分不足发贴
      // 用户积分足够的时候，新建Post，减除用户对应的积分
      const user = await User.findByID({ _id: obj._id })
      if (user.favs < body.fav) {
        ctx.body = {
          code: 501,
          msg: '积分不足'
        }
        return
      } else {
        await User.updateOne({ _id: obj._id }, { $inc: { favs: -body.fav } })
      }
      const newPost = new Post(body)
      newPost.uid = obj._id
      const result = await newPost.save()
      ctx.body = {
        code: 200,
        msg: '成功的保存的文章',
        data: result
      }
    } else {
      // 图片验证码验证失败
      ctx.body = {
        code: 500,
        msg: '图片验证码验证失败'
      }
    }
  }

  // 文章详情
  async getPostDetail (ctx) {
    const params = ctx.query
    await Post.updateOne({ _id: params.tid }, { $inc: { reads: 1 } })
    if (!params.tid) {
      ctx.body = {
        code: 500,
        msg: '文章标题为空'
      }
      return
    }
    const post = await Post.findByTid(params.tid)
    if (!post) {
      ctx.body = {
        code: 200,
        data: {},
        msg: '查询文章详情成功'
      }
      return
    }
    let isFav = 0
    // 判断用户是否传递Authorization的数据，即是否登录
    if (
      typeof ctx.header.authorization !== 'undefined' &&
      ctx.header.authorization !== ''
    ) {
      const obj = await getJWTPayload(ctx.header.authorization)
      const userCollect = await UserCollect.findOne({
        uid: obj._id,
        tid: params.tid
      })
      if (userCollect && userCollect.tid) {
        isFav = 1
      }
    }
    const newPost = post.toJSON()
    newPost.isFav = isFav
    const result = rename(newPost, 'uid', 'user')
    ctx.body = {
      code: 200,
      data: result,
      msg: '获取文章详情成功'
    }
  }

  // 更新帖子
  async updatePost (ctx) {
    const { body } = ctx.request
    const sid = body.sid
    const code = body.code
    // 验证图片验证码的时效性、正确性
    const result = await cheackCode(sid, code)
    if (result) {
      const obj = await getJWTPayload(ctx.header.authorization)
      // 判断帖子作者是否为本人
      const post = await Post.findOne({ _id: body.tid })
      // 判断帖子是否结贴
      if (post.uid === obj._id && post.isEnd === '0') {
        const result = await Post.updateOne({ _id: body.tid }, body)
        if (result.ok === 1) {
          ctx.body = {
            code: 200,
            data: result,
            msg: '更新帖子成功'
          }
        } else {
          ctx.body = {
            code: 500,
            data: result,
            msg: '编辑帖子，更新失败'
          }
        }
      } else {
        ctx.body = {
          code: 401,
          msg: '没有操作的权限'
        }
      }
    } else {
      // 图片验证码验证失败
      ctx.body = {
        code: 500,
        msg: '图片验证码验证失败'
      }
    }
  }

  // 更新帖子 ->admin
  // async updatePostByTid (ctx) {
  //   const { body } = ctx.request
  //   const result = await Post.updateOne({ _id: body._id }, body)
  //   if (result.ok === 1) {
  //     ctx.body = {
  //       code: 200,
  //       data: result,
  //       msg: '更新帖子成功'
  //     }
  //   } else {
  //     ctx.body = {
  //       code: 500,
  //       data: result,
  //       msg: '编辑帖子，更新失败'
  //     }
  //   }
  // }
  async deletePostByUid (ctx) {
    const { body } = ctx.request
    const obj = await getJWTPayload(ctx.header.authorization)
    // console.log(obj._id)
    console.log(body.tid)
    const post = await Post.findOne({ uid: obj._id, _id: body.tid })
    if (!post) {
      ctx.body = {
        code: 500,
        msg: '没找到文章'
      }
      return
    }
    // console.log('post.id' + post.id)
    // console.log('body.tid' + body.tid)
    if (post.id === body.tid && post.isEnd === '0') {
      await ContentController.prototype.deletePost(ctx)
      const result = await Post.deleteManyAndRef({ _id: { $in: body.tid } })
      console.log(result)
      if (result.ok === 1) {
        ctx.body = {
          code: 200,
          msg: '删除成功'
        }
      } else {
        ctx.body = {
          code: 500,
          msg: '执行删除失败！'
        }
      }
      // const result = await Post.deleteOne({ _id: params.tid })
      // if (result.ok === 1) {
      //   ctx.body = {
      //     code: 200,
      //     msg: '删除成功'
      //   }
      // } else {
      //   ctx.body = {
      //     code: 500,
      //     msg: '执行删除失败！'
      //   }
      // }
    } else {
      ctx.body = {
        code: 500,
        msg: '删除失败，无权限！'
      }
    }
  }

  // 删除帖子 ->admin
  async deletePost (ctx) {
    const { body } = ctx.request
    // 删除帖子的同时要删除关联表中的数据
    const result = await Post.deleteManyAndRef({ _id: { $in: body.ids } })
    if (result.ok === 1) {
      ctx.body = {
        code: 200,
        msg: '删除成功'
      }
    } else {
      ctx.body = {
        code: 500,
        msg: '执行删除失败！'
      }
    }
  }

  // 获取用户发贴记录
  async getPostByUid (ctx) {
    const params = ctx.query
    const obj = await getJWTPayload(ctx.header.authorization)
    const result = await Post.getListByUid(
      obj._id,
      params.page,
      params.limit ? parseInt(params.limit) : 10
    )
    const total = await Post.countByUid(obj._id)
    if (result.length > 0) {
      ctx.body = {
        code: 200,
        data: result,
        total,
        msg: '查询列表成功'
      }
    } else {
      ctx.body = {
        code: 500,
        msg: '查询列表失败'
      }
    }
  }
  // deletePostByUid
}
export default new ContentController()
